Limites & Equivalents
Technologie jupyter (cliquez pour ouvrir)

La technologie jupyter permet d'exécuter du code python par un simple clique sur Executer ci-dessus.
Les morceaux de code de cette page sont interprétées case par case. Pour savoir quelle case a été interprétée avant une autre, il suffit de repérer le numéro devant la case.
Une fois qu'une case a été interprétée (=exécutée), la page garde en mémoire les variables et fonctions lues
La plateforme propose quelques outils de purge de la mémoire :

  • Il est possible de tout recommencer (dénuméroter) en choisissant dans le menu Kernel ci-dessus Restart & Clear Output pour purger la mémoire de toutes ses variables et de toutes ses executions
  • Dans le menu Kernel choisir Restard & Run All aura le même effet que Restart & Clear Output mais en plus relancera chacune des cases depuis le haut du document jusqu'en bas (renuméroter).

SAUVEGARDER VOTRE TRAVAIL

Pour ne pas perdre votre travail pensez à le sauvegarder régulièrement. Par défault, la sauvegarde par un clic sur la disquette en haut à gauche de page, ou par le racourci clavier classique ctrl+S est une sauvegarde en local, sur le serveur de jupyter. Vous pouvez et devez très régulièrement sauvegarder votre travail sur votre support personnel de sauvegarde (clef USB, se l'envoyer par mail etc). Ce faisant vous disposerez d'un fichier .ipynb (IPYthon NoteBook) qu'il vous suffira de recharger pour avancer. Après le rechargement assurez vous que les fonctionnalités anciennement developpées et variables utilisées sont bien dans la mémoire de la page (en rééxecutant les cases, ou plus rapidement par Kernel > Restart & Run All.

A NOTER : vous pouvez travailler sur le tp (et tout autre fichier .ipynb) hors connexion en installant une version local du notebook de jupyter. Il faut que votre machine possède un interpreteur de python et que vous soyez connecter à internet.

  1. Lancer un terminal
  2. Taper la commande suivante : pip install jupyterlab
  3. Une fois l'installation terminée portez votre attention sur les dernières lignes affichées dans votre terminal vous invitant probablement à taper une ligne de commande pour faire une mise à jour
  4. Pour lancer notebook de jupyter, taper dans votre termial : jupyter notebook
  5. Votre simulateur de serveur est lancé. Il ne faut pas fermer votre terminal, auquel cas votre simulateur de serveur s'interompera. Suivez le lien indiqué dans les dernières lignes de votre terminal pour vous diriger vers votre espace local. L'interface se présente comme celle que vous trouverez sur le web. Votre travail sera cependant toujours enregistré et jamais perdu même si vous le consultez après plusieurs jours

Quelques fonctions utiles dans la suite.

In [1]:
from math import *
from matplotlib.pyplot import *
Définition
On dira que deux suites $ u$ et $ v$ toutes deux non nulle à partir d'une certain rang, sont équivalentes, noté $ u\sim v$ ou $ u_n\sim v_n$ si $$\underset{n\rightarrow+\infty}{\lim}\dfrac{u_n}{v_n}=1$$

Voici l'exemple canonique.

Proposition
Soit $ P$ un polynôme non nul de degré $ p$ et de coefficient dominant $ a\neq 0$ . $$P(n)\sim an^p$$

Démonstration

Soit $ P(x)=\displaystyle{\sum_{i=0}^pa_ix^i}$ . Avec les notations de l'énoncé on a $ a_p=a$ nécessairement non nul par la définition du degré. Alors \begin{eqnarray*} \dfrac{P(n)}{an^p} &=&\dfrac{\displaystyle{\sum_{i=0}^pa_in^i}}{an^p}\\ &=&\sum_{i=0}^p\dfrac{a_in^i}{an^p}\\ &=&\sum_{i=0}^p\dfrac{a_i}{a}n^{i-p} \end{eqnarray*} Or pour $ i$ entre $ 0$ et $ p$ le nombre $ i-p\leqslant 0$ . Précisément strictement inférieur à $ 0$ si $ i\neq p$ de sorte que pour $ i\neq p$ , $ \underset{n\rightarrow+\infty}{\lim}n^{i-p}=0$ et pour $ i=p$ , $ \underset{n\rightarrow+\infty}{\lim}n^{i-p}=1$ . Ce qui prouve le résultat.

Ainsi on a par exemple $ -3n^2-2n+100\sim -3n^2$ . Cela signifie que pour de grande valeur de $n$ le nombre $-3n^2-2n+100$ et le nombre $-3n^2$ sont relativement proche.

Exercice 1

  1. Ecrire une fonction f1(n) qui renvoie $-3n^2-2n+100$
  2. Ecrire une fonction f2(n) qui renvoie $-3n^2$
  3. Comparer les valeurs de f1(n) et f2(n) pour $n\in\{10, 100, 1000, 10000, 100000, 1000000\}$
In [2]:
#1
def f1(n) : return -3*n**2-2*n+100

#2
def f2(n) : return -3*n**2

#3
for i in range(1, 7) : 
    n=10**i
    print("n =", n)
    print("\tf1(n) =", f1(n))
    print("\tf2(n) =", f2(n))
n = 10
	f1(n) = -220
	f2(n) = -300
n = 100
	f1(n) = -30100
	f2(n) = -30000
n = 1000
	f1(n) = -3001900
	f2(n) = -3000000
n = 10000
	f1(n) = -300019900
	f2(n) = -300000000
n = 100000
	f1(n) = -30000199900
	f2(n) = -30000000000
n = 1000000
	f1(n) = -3000001999900
	f2(n) = -3000000000000

Pour s'en convaincre une bonne fois pour toute, réalisons le graphique de ces deux suites (on choisit différents intervalles pour observer l'écart relatif).

In [3]:
for n in [5, 10, 20, 50] :
    N=list(range(n+1))
    y1=[f1(n) for n in N]
    y2=[f2(n) for n in N]

    plot(N, y1, 'r', label="$-3x^2-2x+100$")
    plot(N, y2, 'b.', label="$-3x^2$")
    title("Comparaison des deux suites sur l'intervale $[0 ; "+str(n)+"]$")
    grid(True)
    legend()
    show()

Exercice 2

En imitant le code précédent, comparer $u_n=\dfrac{n+1}{\sqrt{n}+1}$ et $v_n=\sqrt{n}$, à l'aide d'un graphique. En déduire la limite de $u_n$.

In [4]:
n=1000
N=list(range(n+1))
y1=[(n+1)/(sqrt(n)+1) for n in N]
y2=[sqrt(n) for n in N]

plot(N, y1, 'r', label="$\dfrac{n+1}{\sqrt{n}+1}$")
plot(N, y2, 'b.', label="$\sqrt{n}$")
title("Comparaison des deux suites sur l'intervale $[0 ; "+str(n)+"]$")
grid(True)
legend()
show()

Exercice 3

Trouver un équivalent à $u_n=\dfrac{3n-1}{n^2+n+1}$ et vérifier votre résultat à l'aide d'un graphique. En déduire la limite de $u_n$.

In [5]:
#u_n~3/n
n=30
N=list(range(1, n+1))
y1=[(3*n-1)/(n**2+n+1) for n in N]
y2=[3/n for n in N]

plot(N, y1, 'r', label="$\dfrac{3n-1}{n^2+n+1}$")
plot(N, y2, 'b.', label="$\dfrac{3}{n}$")
title("Comparaison des deux suites sur l'intervale $[1 ; "+str(n)+"]$")
grid(True)
legend()
show()

Exercice 4

Trouver un équivalent à $u_n=\dfrac{n^2-n+1}{n^2+n+1}$ et vérifier votre résultat à l'aide d'un graphique. En déduire la limite de $u_n$.

In [6]:
#u_n~1
n=500
N=list(range(n+1))
y1=[(n**2-n+1)/(n**2+n+1) for n in N]
y2=[1 for n in N]

plot(N, y1, 'r', label="$\dfrac{n^2-n+1}{n^2+n+1}$")
plot(N, y2, 'b.', label="$1$")
title("Comparaison des deux suites sur l'intervale $[0 ; "+str(n)+"]$")
grid(True)
legend()
show()

Formule de Stirling

Théorème
$$n!\sim\sqrt{2\pi n}\left(\dfrac{n}{e}\right)^n$$

Ecrire les fonctions Factoriel(n) et Stirling(n) qui renvoient respectivement $n!$ et $\sqrt{2\pi n}\left(\dfrac{n}{e}\right)^n$. La troisième case permettra de visualiser les différentes valeurs de ces fonctions et de comparer les courbes, qui tendent à se rapprocher.

In [7]:
def Factoriel(n) :
    try : n=int(n)
    except : return 0
    
    if(n<=1) : return 1
    res=1
    for i in range(2, n+1) : res*=i
    return res
In [8]:
def Stirling(n) : return (sqrt(2*pi*n))*((n/exp(1))**n)
In [9]:
for n in [3, 10, 25] :
    x=list(range(0, n+1))
    y1=[Factoriel(n) for n in x]
    y2=[Stirling(n) for n in x]

    plot(x, y1, 'r', label="n!")
    plot(x, y2, 'b.', label="Stirling")
    title("Représentation de $n!$ et son équivalent sur $[0 ; "+str(n)+"]$")
    legend()
    grid(True)
    show()

Formulaires

Proposition (Formulaire I)
Soit $u$ une suite ne s'annulant pas à partir d'un certain rang tel que $\displaystyle{\lim_{n\rightarrow+\infty} u_n=0}$.
  1. $\forall \alpha\in \mathbb{R}^*$ , $(1+u_n)^\alpha-1\sim \alpha u_n$
  2. $\dfrac{1}{1-u_n}-1\sim u_n$
  3. $\dfrac{1}{1+u_n}-1\sim -u_n$
  4. $\sqrt{1+u_n}-1\sim \dfrac{1}{2}u_n$
  5. $e^{u_n}-1\sim u_n$
  6. $ln(1+u_n)\sim u_n$
  7. $sin(u_n)\sim u_n$
  8. $1-cos(u_n)\sim \dfrac{u_n^2}{2}$
  9. $tan(u_n)\sim u_n$
Proposition (Formulaire II)
Soient $a$, $b$, $c$ et $d$ quatre suites ne s'annulant pas à partir d'un certain rang, $\alpha\in \mathbb{R}$.
  1. \(\left[(a\sim b)\wedge(c\sim d)\right]\Rightarrow (ac\sim bd)\)
  2. \(\left[(a\sim b)\wedge(c\sim d)\right]\Rightarrow \left(\dfrac{a}{c}\sim\dfrac{b}{d}\right)\)
  3. \(a\sim b\Rightarrow a^\alpha\sim b^\alpha\)

Exercice 5

Trouver un équivalent à $u_n=\left(e^{\frac{1}{n}}-1\right)ln\left(\dfrac{n+1}{n}\right)$ et vérifier votre résultat à l'aide d'un graphique. En déduire la limite de cette suite.

In [10]:
#u_n~(1/n)(1/n)=1/n²
n=100
N=list(range(1,n+1))
y1=[(exp(1/n)-1)*log((n+1)/n) for n in N]
y2=[1/n*2 for n in N]

plot(N, y1, 'r', label="$(e^{\dfrac{1}{n}}-1)ln(\dfrac{n+1}{n})$")
plot(N, y2, 'b.', label="$\dfrac{1}{n^2}$")
title("Comparaison des deux suites sur l'intervale $[1 ; "+str(n)+"]$")
grid(True)
legend()
show()

Exercice 6

Trouver un équivalent à $u_n=\dfrac{n^{\frac{2n+1}{2}}e^{-n}}{n!}$ et vérifier votre résultat à l'aide d'un graphique. En déduire la limite de cette suite.

In [11]:
#u_n~1/r(2pi) 

n=100
N=list(range(1,n+1))
y1=[(n**((2*n+1)/2)*exp(-n))/Factoriel(n) for n in N]
y2=[1/sqrt(2*pi) for n in N]

plot(N, y1, 'r', label="$\dfrac{n^{\dfrac{2n+1}{2}}e^{-n}}{n!}$")
plot(N, y2, 'b.', label="$\dfrac{1}{\sqrt{2\pi}}$")
title("Comparaison des deux suites sur l'intervale $[1 ; "+str(n)+"]$")
grid(True)
legend()
show()

Exercice 7

Trouver un équivalent à $u_n=n^\alpha\sqrt{1-cos\left(\dfrac{1}{n}\right)}$ pour tout $a\in \mathbb{R}$ et vérifier votre résultat à l'aide d'un graphique. En déduire la limite de cette suite.

In [12]:
#u_n~n^(alpha-1)/r(2)
for a in [-10, -1, 0, 1, 5] :
    n=25
    N=list(range(1,n+1))
    y1=[n**a*sqrt(1-cos(1/n)) for n in N]
    y2=[n**(a-1)/sqrt(2) for n in N]

    plot(N, y1, 'r', label="$n^{"+str(a)+"}\sqrt{1-cos(\dfrac{1}{n})}$")
    plot(N, y2, '.b', label="$\dfrac{n^{"+str(a-1)+"}}{\sqrt{2}}$")
    title("Comparaison des deux suites sur l'intervale $[1 ; "+str(n)+"]$")
    grid(True)
    legend()
    show()

Exercice 8

L'ordinateur est dans le fond un objet de calcul plutôt élementaire. Le ou de la logique est en fait une addition et le et une multiplication. En s'appuyant sur ces outils, en rajoutant un bit de signe par exemple, on peut définir assez facilement la soustracion et un peu moins facilement la division. En bref, les quatres opérations élémentaires se programment assez facilement en bas niveau. Mais comment fait l'ordinateur pour calculer une racine carré par exemple ? On peut démontrer que la suite $ \left\{ \begin{array}{rcl} u_0&=&1\\ u_{n+1}&=& \dfrac{1}{2}\left(u_n+\dfrac{2}{u_n}\right) \end{array} \right. $ tend vers $\sqrt{2}$.

  1. Calculer $u_{0}, \ldots, u_{5}$
  2. Déterminer le plus petit entier $n$ tel que $u_n$ vaut $\sqrt{2}$ à $5$, $10$ puis $15$ décimales correctes.
  3. Modifier la suite $u$ pour déterminer une valeur approchée de $\sqrt{5}$
  4. Quelle valeure est approchée par la suite $v_n=\left(1+\dfrac{1}{n}\right)^n$. Comparer cette formule avec la vraie valeure de python à $3$ décimales près.

In [13]:
#1
N=5
U=[1]
for n in range(N) :
    u=U[-1]
    U.append(0.5*(u+2/u))

for n in range(N+1) :
    print("U_"+str(n)+" =", U[n])
    
#2
s=sqrt(2)
print("Valeur de python de racine de 2 =", s)
for decimale in [5, 10, 15] : 
    n=0
    u=1
    while(abs(u-s)>10**(-decimale)) :
        n+=1
        u=0.5*(u+2/u)
    print("Ma valeur de racine de 2 :", u, "otenue en", n, "itérations")
    
#3
s=sqrt(5)
print("Valeur de python de racine de 5 =", s)
for decimale in [5, 10, 15] : 
    n=0
    u=1
    while(abs(u-s)>10**(-decimale)) :
        n+=1
        u=0.5*(u+5/u)
    print("Ma valeur de racine de 5 :", u, "otenue en", n, "itérations")
    
#4
e=exp(1)
print("Valeur de python de e =", e)
n=0
while(abs(u-e)>10**(-3)) :
    n+=1
    u=(1+1/n)**n
print("Ma valeur de e :", u, "otenue en", n, "itérations")
 
U_0 = 1
U_1 = 1.5
U_2 = 1.4166666666666665
U_3 = 1.4142156862745097
U_4 = 1.4142135623746899
U_5 = 1.414213562373095
Valeur de python de racine de 2 = 1.4142135623730951
Ma valeur de racine de 2 : 1.4142156862745097 otenue en 3 itérations
Ma valeur de racine de 2 : 1.4142135623746899 otenue en 4 itérations
Ma valeur de racine de 2 : 1.414213562373095 otenue en 5 itérations
Valeur de python de racine de 5 = 2.23606797749979
Ma valeur de racine de 5 : 2.2360688956433634 otenue en 4 itérations
Ma valeur de racine de 5 : 2.236067977499978 otenue en 5 itérations
Ma valeur de racine de 5 : 2.23606797749979 otenue en 6 itérations
Valeur de python de e = 2.718281828459045
Ma valeur de e : 2.7172823988811725 otenue en 1359 itérations

Exercice 9

On considère la suite $ \left\{ \begin{array}{rcl} u_0&=&0.2\\ u_{n+1}&=&-\dfrac{1}{2}u_n+1 \end{array} \right. $

  1. Ecrire la fonction U_n qui prend en paramètre un entier $n$ et qui renvoie la liste des $n+1$ premier terme de la suite (de $u_0$ à $u_n$).
  2. Dans un graphique, déssiner la droite $x\mapsto -\dfrac{1}{2}x+1$ sur l'intervale $[0 ; 1.1]$ bleue.
  3. Sur ce même graphique, déssiner la droite $y=x$ en vert.
  4. Considérons les points $X_n$ et $Y_n$ de coordonnées respectives $(u_n, u_{n+1})$ et $(u_n, u_n)$. Ecrire les fonctions X_n et Y_n qui prennent en paramètre un entier $n$ et la liste U des termes de la suite et qui renvoient les coordonnées des points éponymes. Ces coordonnées pourront être stockées dans un tableau ou dans un tuple.
  5. Sur ce même graphique, déssiner en rouge les segments $[X_nY_{n+1}]$ et $[Y_{n+1}X_{n+1}]$ pour $n$ prennant les valeurs entière entre $0$ et $8$ (attention aux indices).
  6. Quelle conjecture pouvez-vous faire sur la limite de la suite $u_n$ ?

In [14]:
#1
def U_n(n) : 
    if(n==0) : return [0.2]
    X=U_n(n-1)
    u=X[-1]
    X.append(-1/2*u+1)
    return X

#2
plot([0, 1], [1, 1/2], 'b')
xlim(0, 1)
ylim(0, 1)
title("Question 2")
grid(True)
show()

#3
plot([0,1], [0,1], 'g')
plot([0, 1], [1, 1/2], 'b')
xlim(0, 1)
ylim(0, 1)
title("Question 3")
grid(True)
show()

#4
def X_n(n, U) : 
    return [U[n], U[n+1]]
def Y_n(n, U) : 
    return [U[n], U[n]]

#5
N=8
U=U_n(N+2)
for n in range(N) : 
    A=X_n(n, U)
    B=Y_n(n+1, U)
    C=X_n(n+1, U)
    plot([A[0], B[0], C[0]], [A[1], B[1], C[1]], 'r')
plot([0,1], [0,1], 'g')
plot([0, 1], [1, 1/2], 'b')
xlim(0, 1)
ylim(0, 1)
title("Question 5")
grid(True)
show()

#6
#La limite à l'air d'être 0.65

Exercice 10

Même exercice que précédement avec la suite $ \left\{ \begin{array}{rcl} u_0&=&1\\ u_{n+1}&=&sin(u_n) \end{array} \right. $

In [15]:
def U_n(n) : 
    if(n==0) : return [1]
    X=U_n(n-1)
    u=X[-1]
    X.append(sin(u))
    return X

def X_n(n, U) : 
    return [U[n], U[n+1]]
def Y_n(n, U) : 
    return [U[n], U[n]]

N=100
U=U_n(N+2)
for n in range(N) : 
    A=X_n(n, U)
    B=Y_n(n+1, U)
    C=X_n(n+1, U)
    plot([A[0], B[0], C[0]], [A[1], B[1], C[1]], 'r')
plot([0,1], [0,1], 'g', lw="0.3")
X=[k/1000 for k in range(1001)]
Y=[sin(x) for x in X]
plot(X, Y, 'b', lw="0.3")
xlim(0, 1)
ylim(0, 1)
grid(True)
show()

#La limite à l'air d'être 0
In [ ]: